From e17b5f337d319a89f979f623b124f1653670a042 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 17 Jul 2020 15:51:28 -0400 Subject: [PATCH] a11y: Update GtkCheckButton This is a bit unfortunate, since the aria modelling doesn't quite agree with ours, so we have to listen for the togglebutton property change, and we inherit the pressed state from the togglebutton accessible. --- gtk/gtkcheckbutton.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c index efc0112791..82e2fd5963 100644 --- a/gtk/gtkcheckbutton.c +++ b/gtk/gtkcheckbutton.c @@ -171,12 +171,43 @@ gtk_check_button_get_property (GObject *object, } } +static void +update_accessible_state (GtkCheckButton *check_button) +{ + GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button); + + GtkAccessibleTristate checked_state; + + if (priv->inconsistent) + checked_state = GTK_ACCESSIBLE_TRISTATE_MIXED; + else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button))) + checked_state = GTK_ACCESSIBLE_TRISTATE_TRUE; + else + checked_state = GTK_ACCESSIBLE_TRISTATE_FALSE; + + gtk_accessible_update_state (GTK_ACCESSIBLE (check_button), + GTK_ACCESSIBLE_STATE_CHECKED, checked_state, + -1); +} + +static void +gtk_check_button_notify (GObject *object, + GParamSpec *pspec) +{ + if (pspec->name == I_("active")) + update_accessible_state (GTK_CHECK_BUTTON (object)); + + if (G_OBJECT_CLASS (gtk_check_button_parent_class)->notify) + G_OBJECT_CLASS (gtk_check_button_parent_class)->notify (object, pspec); +} + static void gtk_check_button_class_init (GtkCheckButtonClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + object_class->notify = gtk_check_button_notify; object_class->finalize = gtk_check_button_finalize; object_class->set_property = gtk_check_button_set_property; object_class->get_property = gtk_check_button_get_property; @@ -394,6 +425,8 @@ gtk_check_button_set_inconsistent (GtkCheckButton *check_button, else gtk_widget_unset_state_flags (GTK_WIDGET (check_button), GTK_STATE_FLAG_INCONSISTENT); + update_accessible_state (check_button); + g_object_notify_by_pspec (G_OBJECT (check_button), props[PROP_INCONSISTENT]); } } -- 2.30.2